import { _decorator, Component, Node, resources, SpriteFrame, assetManager, JsonAsset } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('CommonResourceManager')
export class CommonResourceManager{
    
    public static instance : CommonResourceManager | null;

    public static getInstance() : CommonResourceManager{
        if(!CommonResourceManager.instance){
            CommonResourceManager.instance = new CommonResourceManager();
        }
        return CommonResourceManager.instance;
    }

    public JsonCurrencyData : Array = null;

    public JsonFontData : any = null;

    /**
     * 返回加载之后的国家货币汇率json文件
    */
    public backNationJson(){
        return  this.JsonCurrencyData;
    }

     /**
     * 返回加载之后的国家货币汇率json文件
    */
      public backNationFontJson(){
        return  this.JsonFontData;
    }

    /**
     * 加载某个目录下的单个资源
     * @param url - 主路径
     * @param name - 资源名
     * @param type - 资源类型
     * @param callback 加载完成之后的回调
    */
    public loadSingleResources(url,name,type,callback){
        resources.load(url + "/" + name,type,(err,res)=>{
            if(err){
                console.log(err);
                return;
            }
            callback(res);
        })
    }

    /**
     * 加载某个目录下的所有资源
     * @param url - 主路径
     * @param name - 资源名
     * @param type - 资源类型
     * @param callback 加载完成之后的回调
    */
    public loadAllResources(url,name,type,callback){
        resources.loadDir(url + "/" + name,type,(err,res)=>{
            if(err){
                console.log(err);
                return;
            }
            callback(res);
        })
    }

    /**
     * 加载涉及国家货币和汇率Json文件
     * @param JsonName - 主路径
     * @param callback 加载完成之后的回调
    */
     public loadNationJsonResources(JsonName,callback){
        this.loadSingleResources("json",JsonName,JsonAsset,(json)=>{
            this.JsonCurrencyData = json.json;
            callback(json.json);
        })
    }

    /**
     * 加载涉及国家的语言Json文件
     * @param JsonName - 主路径
     * @param callback 加载完成之后的回调
    */
     public loadNationFontJsonResources(city,JsonName,callback){
        this.loadSingleResources("json" + "/" + city,JsonName,JsonAsset,(json)=>{
            this.JsonFontData = json.json;
            callback(json.json);
        })
    }
 
    /**
     * 加载产品ICON
     * @param callback 加载完成之后的回调
    */
    public loadProjectIconResources(product,callback){
        let type = product.split("_")[0];
        this.loadBundleResourcesAllFile("icon",type + "/" + product,(list)=>{
            //可能存在多个ICON 随机使用一个
            if(list.length > 0){
                let random = list.length.random() | 0;
                callback(list[random]);
            }else{
                console.log("--------未获取到ICON资源,请导入对应的ICON--------");
                callback(null);
            }
        })
    }

    /**
     * 加载涉及国家的语言页面
     * @param url - 主路径
     * @param type - 获取的页面样式
     * @param city - 获取的国家
     * @param callback 加载完成之后的回调
    */
    public loadProjectNationResources(bundleName,type,city,callback){
        let url = "";
        if(bundleName.indexOf("end") > -1){
            url = url + "/" + type + "/" + city;
        }else{
            url = url + "/" + type + "/" + city;
        }
        this.loadBundleResourcesAllFile(bundleName,url,(list)=>{
            if(list.length == 0){
                console.log("--------未获取账单资源,请导入对应的账单--------")
            }
            callback(list);
        })
    }

    /**
     * 从资源列表中找出指定资源
     * @param list - 资源列表
     * @param name - 资源名字
    */
    public chechOutResources(list,name){
        for(let i in list){
            if(list[i].name == name){
                return list[i];
            }
        }
        return null;
    }

    /**
     * 通过bundle获取指定图片资源文件
     * @param bundleName - bundle名字
     * @param fileName - 资源名字
     * @param callback 加载完成之后的回调
    */
    public loadBundleResourcesInFile(bundleName,fileName,callback){
        assetManager.loadBundle(bundleName, (err, bundle) => {
            if(err){
                console.log("获取bundle失败",err);
                return;
            }
            bundle.load(fileName, SpriteFrame, (err, sp) => {
                if(err){
                    console.log("获取资源失败",err);
                    return;
                }
                callback(sp);
            });
        }); 
    }

    /**
     * 获取指定bundle文件
     * @param bundleName - bundle名字
     * @param callback 加载完成之后的回调
    */
     public loadBundleResources(bundleName,callback){
        assetManager.loadBundle(bundleName, (err, bundle) => {
            if(err){
                console.log("获取bundle失败",err);
                return;
            }
            callback(bundle);
        }); 
    }

     /**
     * 获取指定bundle文件下文件的所有图片资源
     * @param bundleName - bundle名字
     * @param fileName - bundle名字
     * @param callback 加载完成之后的回调
    */
      public loadBundleResourcesAllFile(bundleName,fileName,callback){
        assetManager.loadBundle(bundleName, (err, bundle) => {
            if(err){
                console.log("获取bundle失败",err);
                return;
            }
            bundle.loadDir(fileName, SpriteFrame, (err, list) => {
                if(err){
                    console.log("获取资源失败",err);
                    return;
                }
                callback(list);
            });
        }); 
    }
}

